package design.wlb.java_reading.util;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Arrays;
import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        // 数据库连接配置
        String url = "jdbc:mysql://132.232.100.99:23306/yijing?useSSL=false&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "8848";

        FastAutoGenerator.create(url, username, password)
                // 1. 全局配置
                .globalConfig(builder -> {
                    builder.author("wlb") // 设置作者
                            .outputDir(System.getProperty("user.dir") + "/src/main/java") // 输出目录
                            .commentDate("yyyy-MM-dd") // 注释日期
                            .dateType(DateType.ONLY_DATE) // 定义生成的实体类中日期的类型 TIME_PACKAGE=Java 8 时间类型, ONLY_DATE=只使用 java.util.Date
                            .disableOpenDir(); // 禁止打开输出目录
                })
                // 2. 包配置
                .packageConfig(builder -> {
                    builder.parent("design.wlb") // 父包名
                            .moduleName("java_reading") // 模块名（可选），生成的文件会在 com.example.demo 下
                            .entity("entity") // 实体类包名
                            .mapper("mapper") // Mapper 接口包名
                            .service("service") // Service 接口包名
                            .serviceImpl("service.impl") // Service 实现类包名
                            .controller("controller") // Controller 包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置 mapperXml 文件路径
                })
                // 3. 策略配置
                // 3. 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("gua_eight", "gua_sixty_four") // 设置需要生成的表名
                            .addTablePrefix("t_", "sys_") // 设置过滤表前缀

                            // 实体类策略配置
                            .entityBuilder()
                            .enableFileOverride() // 【重要】启用覆盖实体类文件
                            .naming(NamingStrategy.underline_to_camel) // 表名转驼峰
                            .columnNaming(NamingStrategy.underline_to_camel) // 列名转驼峰
                            .enableLombok() // 启用Lombok
                            .enableTableFieldAnnotation() // 启用字段注解
                            .idType(IdType.AUTO) // 主键策略
                            .addTableFills(Arrays.asList( // 自动填充配置
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE)
                            ))

                            // Mapper策略配置
                            .mapperBuilder()
                            .enableFileOverride() // 【重要】启用覆盖Mapper接口文件
                            .enableMapperAnnotation() // 启用@Mapper注解

                            // Service策略配置
                            .serviceBuilder()
                            .enableFileOverride() // 【重要】启用覆盖Service接口及实现类文件
                            .formatServiceFileName("%sService") // 服务接口命名
                            .formatServiceImplFileName("%sServiceImpl") // 服务实现类命名

                            // Controller策略配置
                            .controllerBuilder()
                            .enableFileOverride() // 【重要】启用覆盖Controller文件
                            .enableRestStyle() // 启用@RestController
                            .enableHyphenStyle(); // 启用驼峰转连字符
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎
                .execute(); // 执行生成
    }
}